#!/bin/bash

# 测试环境设置脚本
# 用于配置和初始化测试环境

echo "🚀 开始配置测试环境..."

# 确保脚本在 backend 目录下运行
if [ ! -f "package.json" ]; then
  echo "❌ 错误: 请在 backend 目录下运行此脚本"
  exit 1
fi

# 检查必要工具
echo "🔍 检查必要工具..."

REQUIRED_TOOLS=(
  "node"
  "npm"
  "psql"
  "redis-cli"
)

for tool in "${REQUIRED_TOOLS[@]}"; do
  if ! command -v "$tool" &> /dev/null; then
    echo "❌ 未找到必要工具: $tool"
    exit 1
  fi
done

# 创建测试目录结构
echo -e "\n📁 创建测试目录结构..."

TEST_DIRS=(
  "test/logs"
  "test/uploads"
  "test/backups"
  "test/fixtures"
  "test/reports"
  "test/coverage"
)

for dir in "${TEST_DIRS[@]}"; do
  mkdir -p "$dir"
  echo "✓ 已创建: $dir"
done

# 复制环境配置文件
echo -e "\n📝 配置测试环境变量..."

if [ ! -f ".env.test" ]; then
  if [ -f ".env.example" ]; then
    cp .env.example .env.test
    echo "✓ 已从 .env.example 创建 .env.test"
  else
    echo "❌ 错误: 未找到 .env.example 文件"
    exit 1
  fi
fi

# 检查并安装依赖
echo -e "\n📦 检查测试依赖..."

TEST_DEPS=(
  "@types/jest"
  "jest"
  "ts-jest"
  "supertest"
  "@types/supertest"
)

for dep in "${TEST_DEPS[@]}"; do
  if ! npm list "$dep" &> /dev/null; then
    echo "安装依赖: $dep"
    npm install --save-dev "$dep"
  fi
done

# 设置测试数据库
echo -e "\n🗃️  配置测试数据库..."

# 加载测试环境变量
set -a
source .env.test
set +a

# 创建测试数据库和用户
echo "• 创建测试数据库..."
PGPASSWORD=${POSTGRES_PASSWORD} psql -h "$DATABASE_HOST" -p "$DATABASE_PORT" -U postgres << EOF
  DO \$\$
  BEGIN
    IF NOT EXISTS (SELECT FROM pg_user WHERE usename = '${DATABASE_USER}') THEN
      CREATE USER ${DATABASE_USER} WITH PASSWORD '${DATABASE_PASSWORD}';
    END IF;
  END
  \$\$;

  SELECT 'CREATE DATABASE ${DATABASE_NAME}'
  WHERE NOT EXISTS (SELECT FROM pg_database WHERE datname = '${DATABASE_NAME}')\gexec

  GRANT ALL PRIVILEGES ON DATABASE ${DATABASE_NAME} TO ${DATABASE_USER};
EOF

if [ $? -eq 0 ]; then
  echo "✓ 测试数据库配置完成"
else
  echo "❌ 测试数据库配置失败"
  exit 1
fi

# 运行数据库迁移
echo -e "\n⚙️  运行数据库迁移..."
NODE_ENV=test npm run prisma:migrate

# 生成 Prisma 客户端
echo -e "\n🔧 生成 Prisma 客户端..."
npm run prisma:generate

# 初始化测试数据
echo -e "\n🌱 初始化测试数据..."
NODE_ENV=test npm run seed:test -- -f

# 运行测试检查
echo -e "\n🧪 运行测试检查..."
npm run test -- --detectOpenHandles

echo -e "\n✅ 测试环境配置完成!"
echo -e "\n💡 使用说明:"
echo "• npm test               - 运行所有测试"
echo "• npm run test:watch    - 监听模式运行测试"
echo "• npm run test:coverage - 生成测试覆盖率报告"

echo -e "\n📝 提示:"
echo "• 测试数据库: ${DATABASE_NAME}"
echo "• 测试端口: ${PORT}"
echo "• 测试日志: ./test/logs"
echo "• 测试报告: ./test/reports"

echo -e "\n⚠️  注意事项:"
echo "• 测试环境使用独立的数据库"
echo "• 每次测试会重置数据"
echo "• 测试覆盖率报告在 ./test/coverage"
echo "• 如需调试,使用 npm run test:debug"

# 检查常见问题
echo -e "\n🔍 环境检查..."

# 检查端口占用
if lsof -Pi :${PORT} -sTCP:LISTEN -t &> /dev/null; then
  echo "⚠️  警告: 端口 ${PORT} 已被占用"
fi

# 检查Redis连接
if ! redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" ping &> /dev/null; then
  echo "⚠️  警告: 无法连接到Redis"
fi

# 检查目录权限
for dir in "${TEST_DIRS[@]}"; do
  if [ ! -w "$dir" ]; then
    echo "⚠️  警告: 目录 $dir 没有写入权限"
  fi
done

echo -e "\n🎉 测试环境设置完成！"
